﻿#ifndef _MONSTERROLE_H_INCLUDE_
#define _MONSTERROLE_H_INCLUDE_

#include "common.h"
#include "baserole.h"

#include <QVector>
#include <QHash>
#include <QList>

class MonsterRole : public BaseRole
{
public:
    MonsterRole();
    ~MonsterRole();

    /// 设置警戒距离
    inline void setGuardDistance(int distance)
    {
        mGuardDistance = distance;
        //mAttackDistance = mGuardDistance/2;
    }
    /// 得到警戒距离
    inline int getGuardDistance(void) { return mGuardDistance; }
    /// 设置攻击距离
    inline void setAttackDistance(int distance) { mAttackDistance = distance; }
    /// 得到攻击距离
    inline int getAttackDistance(void) { return mAttackDistance; }
    /// 设置攻击间隔时间
    inline void setAttackTimeSpace(int space) { mAttackTimeSpace = space; }
    /// 得到攻击间隔时间
    inline int getAttackTimeSpace(void) { return mAttackTimeSpace; }
    /// 设置被警戒的玩家
    inline void setGuardPlayer(BaseRole *role) { mGuardPlayer = role; }
    /// 得到被警戒的玩家
    inline BaseRole* getGuardPlayer(void) { return mGuardPlayer; }
    /// 设置状态开始时间
    inline void setStateStartTime(qint64 time) { mCurStateTime = time; }
    /// 得到状态开始时间
    inline qint64 getStateStartTime(void) { return mCurStateTime; }
    /// 添加活动地图
    bool addActivityMap(int mapid,QRect rect);
    /// 得到活动地图
    inline QList<QRect> getActivityMap(int mapid);
    /// 得到所有的活动地图
    inline QHash<int,QList<QRect>>& getAllActivityMap(void) { return mActivityMaps; }
    /// 检测指定的地图编码是否属于当前活动地图
    bool isExistActivityMap(int mapid);
    /// 设置当前所在地图ID
    inline void setCurAcitivityMapId(int mapid) { mCurAcitivityMapId = mapid; }
    /// 得到当前所在地图ID
    inline int getCurAcitivityMapId(void) { return mCurAcitivityMapId; }
    /// 得到当前所在地图活动区域ID
    inline int getCurMapActivityRectId(void) { return mCurMapActivityRectId; }

    /// 更新
    virtual void update(void);
    /// 重置
    void reset(void);

private:
    /// 得到警戒距离内的玩家
    QList<BaseRole*> getGuardDistancePlayers(void);
    /// 警戒处理
    void onProcessGuard(void);
    /// 攻击处理
    void onProcessAttack(void);
    /// 发动一次攻击
    void Attack(BaseRole *pBaseRole);

private:
    int mGuardDistance;                           /**< 警戒距离 */
    int mAttackDistance;                          /**< 攻击距离是警戒距离的一半 */
    BaseRole *mGuardPlayer;                       /**< 被警戒的玩家 */
    qint64 mGuardPlayerTime;                      /**< 被警戒的玩家的时间 */
    QHash<int,QList<QRect>> mActivityMaps;        /**< 活动地图 */
    int mCurAcitivityMapId;                       /**< 当前所在地图ID */
    int mCurMapActivityRectId;                    /**< 当前所在地图活动区域 */

    qint64 mCurAttackTime;                        /**< 攻击时间 */
    int mAttackTimeSpace;                         /**< 攻击时间间隔 */

    qint64 mCurStateTime;                         /**< 当前状态时间统计 */
    int mCurStateMaxTime;                         /**< 当前状态维持的最大时间 */
};

#endif // MONSTERROLE_H
